#include "serial.h"                    // Device header

char Serial_Data;
char Serial_Buffer[30];
uint8_t Serial_Index;
volatile uint32_t uartTick;

/*************************************************************串口1功能*************************************************************/
void Uart1_SendChar(uint8_t byte)
{
    UARTCharPut(UART1_BASE, byte);
}

/**
 * @brief 串口1的重定向函数
 * 用于测试摄像头发送过来的数据是否正常
 * @param fmt 
 * @param ... 
 */
void U1_printf(char *fmt, ...)
{
    uint16_t i, j;
    char Uart1_TxBuffer[100];
    va_list ap;
    va_start(ap, fmt);
    vsprintf((char *)Uart1_TxBuffer, fmt, ap);
    va_end(ap);
    i = strlen((const char *)Uart1_TxBuffer); // 此次发送数据的长度
    for (j = 0; j < i; j++)                   // 循环发送数据
    {
        Uart1_SendChar(Uart1_TxBuffer[j]);
    }
    memset(Uart1_TxBuffer, 0, sizeof(Uart1_TxBuffer));
}

/**
 * @brief UART1_IRQHandler
 * 串口1的接收中断函数，主要用来测试串口1的收发功能是否完整
 *
 */
void UART1_IRQHandler(void)
{
    if (UARTIntStatus(UART1_BASE, true) == UART_INT_RX) // 判断接收标志位      你也可以定义一个变量接收串口中断并进行清除
    {
        UARTIntClear(UART1_BASE, UART_INT_RX);
        // Serial_Data=UARTCharGetNonBlocking(UART1_BASE);  //非阻塞式数据接收
        // Serial_Buffer[Serial_Index++]=Serial_Data;
        // uartTick=millis();      //刷新字符之间的接收时间
    }
}

/**
 * @brief Uart1_Init
 * 串口1的初始化函数
 * 
 */
void UART1_Init(void)
{
    ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART1); // 使能系统外设，包括gpio以及uart
    ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); //
    ROM_GPIOPinConfigure(GPIO_PB0_U1RX);             // gpio端口配置为复用模式
    ROM_GPIOPinConfigure(GPIO_PB1_U1TX);
    ROM_GPIOPinTypeUART(GPIO_PORTB_BASE, GPIO_PIN_0 | GPIO_PIN_1);                                                               // 配置uart的外设使用引脚
    UARTConfigSetExpClk(UART1_BASE, SysCtlClockGet(), 9600, (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE)); // 配置uart参数
    UARTFIFODisable(UART1_BASE);                                                                                                 // 关闭fifo寄存器，快速反应接受的数据

    UARTIntEnable(UART1_BASE, UART_INT_RX); // 使能中断
    // UARTIntRegister(UART1_BASE,UART1_IRQHandler);       //注册中断函数
    ROM_IntPrioritySet(INT_UART1, 0x50); // 设置中断优先级
}
/*************************************************************串口1功能*************************************************************/

/*************************************************************串口0功能*************************************************************/
/**
 * @brief 串口0中断服务函数
 * 作用：接收串口中断的字符数据，用于获取openmv发送过来的数据帧
 */
void UART0_IRQHandler(void)
{
    if(UARTIntStatus(UART0_BASE,true)==UART_INT_RX)     //串口标志位的判断
    {
        if(UARTCharsAvail(UART0_BASE)>0)        //判断rxFIFO中是否有字符
        {
            UARTIntClear(UART0_BASE,UART_INT_RX);   //清除串口接收中断
            Serial_Data=UARTCharGet(UART0_BASE); //接受单个字符数据
            Serial_Buffer[Serial_Index++]=Serial_Data;      //将字符接收数据整合在一起
            uartTick=millis();    //刷新字符之间的接收时间，字符之间的间隔时间一般设置在20ms左右
        }
    }
}

int fputc(int ch, FILE *f)  //串口重定向
{
    // while (UARTSpaceAvail(UART0_BASE)==0);      //判断txFIFO是否还有空间
    UARTCharPut(UART0_BASE,ch);	
    return (ch);
}

/**
 * @brief 串口初始化函数
 * 配置gpio端口
 * 配置gpio的复用功能到uart
 * 配置uart的基本参数设置
 * 配置和注册uart的优先级以及终端函数
 */
void UART0_Init(void)
{
    //配置io口
    ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);    //配置系统时钟
    ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
    ROM_GPIOPinConfigure(GPIO_PA0_U0RX);            //配置gpio的复用功能
    ROM_GPIOPinConfigure(GPIO_PA1_U0TX);
    ROM_GPIOPinTypeUART(GPIO_PORTA_BASE,GPIO_PIN_0|GPIO_PIN_1);    //配置uart的外设引脚

    //配置uart
    //8位数据位，1个停止位，无校验位
    ROM_UARTConfigSetExpClk(UART0_BASE,SysCtlClockGet(),9600,UART_CONFIG_WLEN_8|UART_CONFIG_STOP_ONE|UART_CONFIG_PAR_NONE);

    UARTFIFODisable(UART0_BASE);        //********关闭fifo寄存器，快速反应接受的数据
    UARTIntRegister(UART0_BASE,UART0_IRQHandler);       //注册串口中断函数
    ROM_IntPrioritySet(INT_UART0,0x01);            //设置中断优先级
    ROM_UARTIntEnable(UART0_BASE,UART_INT_RX);         //使能串口中断

}
/*************************************************************串口0功能*************************************************************/

